package com.example.apitesttool.service;

import dev.langchain4j.agent.tool.Tool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 固定参数管理工具类
 * 
 * 为大模型提供固定参数管理能力的工具集合。
 * 这些工具允许 AI Agent 设置、查询和管理固定参数，如 API Key、Authorization Token 等。
 * 
 * 特性：
 * - 设置固定参数
 * - 查询参数信息
 * - 删除参数
 * - 清除所有参数
 * 
 * @author liuxy
 * @version 1.0.0
 */
@Component
public class ParameterManagementTools {
    
    private final FixedParameterManager parameterManager;

    @Autowired
    public ParameterManagementTools(FixedParameterManager parameterManager) {
        this.parameterManager = parameterManager;
    }

    @Tool("设置一个固定参数，例如 App-Key 或 Authorization Token。这些参数会自动添加到所有 HTTP 请求的头部。")
    public String setFixedParameter(String parameterName, String parameterValue) {
        if (parameterName == null || parameterName.trim().isEmpty()) {
            return "参数名称不能为空。";
        }
        
        if (parameterValue == null) {
            parameterValue = "";
        }
        
        parameterManager.setParameter(parameterName.trim(), parameterValue);
        return "已设置固定参数: " + parameterName.trim() + " = " + maskSensitiveValue(parameterName, parameterValue);
    }

    @Tool("获取所有已设置的固定参数信息。")
    public String getAllFixedParameters() {
        return parameterManager.getParametersAsString();
    }

    @Tool("获取指定名称的固定参数值。")
    public String getFixedParameter(String parameterName) {
        if (parameterName == null || parameterName.trim().isEmpty()) {
            return "参数名称不能为空。";
        }
        
        String trimmedName = parameterName.trim();
        return parameterManager.getParameter(trimmedName)
            .map(value -> "参数 '" + trimmedName + "' 的值: " + maskSensitiveValue(trimmedName, value))
            .orElse("参数 '" + trimmedName + "' 不存在。");
    }

    @Tool("删除指定名称的固定参数。")
    public String removeFixedParameter(String parameterName) {
        if (parameterName == null || parameterName.trim().isEmpty()) {
            return "参数名称不能为空。";
        }
        
        String trimmedName = parameterName.trim();
        boolean removed = parameterManager.removeParameter(trimmedName);
        
        if (removed) {
            return "已删除固定参数: " + trimmedName;
        } else {
            return "参数 '" + trimmedName + "' 不存在，无法删除。";
        }
    }

    @Tool("清除所有已设置的固定参数。注意：此操作不可撤销。")
    public String clearAllFixedParameters() {
        int count = parameterManager.getParameterCount();
        parameterManager.clearAllParameters();
        return "已清除所有 " + count + " 个固定参数。";
    }

    @Tool("检查指定名称的固定参数是否存在。")
    public String checkParameterExists(String parameterName) {
        if (parameterName == null || parameterName.trim().isEmpty()) {
            return "参数名称不能为空。";
        }
        
        String trimmedName = parameterName.trim();
        boolean exists = parameterManager.hasParameter(trimmedName);
        
        if (exists) {
            return "参数 '" + trimmedName + "' 存在。";
        } else {
            return "参数 '" + trimmedName + "' 不存在。";
        }
    }

    @Tool("获取固定参数的统计信息。")
    public String getParameterStatistics() {
        int count = parameterManager.getParameterCount();
        
        StringBuilder stats = new StringBuilder();
        stats.append("固定参数统计信息:\n");
        stats.append("- 总参数数量: ").append(count).append("\n");
        
        if (count > 0) {
            stats.append("\n使用 getAllFixedParameters 工具查看详细的参数列表。");
        } else {
            stats.append("\n当前没有设置任何固定参数。");
            stats.append("\n提示：固定参数通常用于设置 API Key、Authorization Token 等认证信息，");
            stats.append("这些参数会自动添加到所有 HTTP 请求的头部。");
        }
        
        return stats.toString();
    }

    /**
     * 对敏感参数值进行脱敏处理
     * 
     * @param paramName 参数名
     * @param value 参数值
     * @return 脱敏后的值
     */
    private String maskSensitiveValue(String paramName, String value) {
        if (value == null || value.length() <= 4) {
            return "****";
        }
        
        // 对可能包含敏感信息的参数进行脱敏
        String lowerName = paramName.toLowerCase();
        if (lowerName.contains("key") || lowerName.contains("token") || 
            lowerName.contains("auth") || lowerName.contains("secret") ||
            lowerName.contains("password")) {
            return value.substring(0, 2) + "****" + value.substring(value.length() - 2);
        }
        
        return value;
    }
}

